/*
 * GestionDeEstandares.java
 *
 * Created on 9/02/2012, 11:37:21 AM
 */
package interfaz.gestionEstandares;

import interfaz.Intro.MenuPrincipal;
import java.util.ArrayList;
import java.util.List;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
import moduloAreas.ManejadorAreas;
import pojos.Areas;
import pojos.CatEstandares;
import pojos.CatReactivos;
import pojos.CatTemas;
import usoHAPSIE.HAPSIEApp;

/**
 *
 * @author Diego Andres Gomez Montesinos
 */
public class GestionDeEstandares extends javax.swing.JDialog {

    CatEstandares estandar;
    CatTemas temaSeleccionado = null;
    boolean modificado = false;
    boolean[][] relacionesAplica = null;
    
    /** Creates new form GestionDeEstandares */
    public GestionDeEstandares(java.awt.Dialog parent) {
        super(parent);
        estandar = MenuPrincipal.manEstandares.getEstandarPorId(HAPSIEApp.idEstandar);
        initComponents();
        cargaArbolDeEstandar();
        creaTablaDeRefinamiento();
        
    }
    
    private void cargaArbolDeEstandar() {
        arbolDeEstandar.setModel(MenuPrincipal.manEstandares.creaArbolDeEstandar(estandar));
        arbolDeEstandar.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
        arbolDeEstandar.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener() {
            @Override
            public void valueChanged(TreeSelectionEvent tse) {
                arbolDeEstandarSeleccionPerformed(tse);
            }
        });
    }
    
    private void arbolDeEstandarSeleccionPerformed(TreeSelectionEvent tse) {
        DefaultMutableTreeNode nodoSeleccionado = (DefaultMutableTreeNode) arbolDeEstandar.getLastSelectedPathComponent();
        
        if(nodoSeleccionado != null) {
            guardaLoActual();
            if(nodoSeleccionado.isLeaf() && nodoSeleccionado.getUserObject().getClass().equals(CatTemas.class)) {
                temaSeleccionado = (CatTemas) nodoSeleccionado.getUserObject();
                tablaRefinamiento.setModel(new DefaultTableModel());
                creaTablaDeRefinamiento();
                llenaTabla();
            }
        }
        
    }
    
    private void creaTablaDeRefinamiento() {
        if(HAPSIEApp.trabajarConAreas) {
            ManejadorAreas manAreas = new ManejadorAreas(HAPSIEApp.servicioConexion);
            final Object[] areas = manAreas.getFullAreas().toArray();
            final Class[] tiposColumnas = new Class[areas.length + 1];
            tiposColumnas[0] = java.lang.Object.class;
            for(int i = 1; i < tiposColumnas.length; i++) {
                tiposColumnas[i] = java.lang.Boolean.class;
            }
            
            DefaultTableModel modelo = new javax.swing.table.DefaultTableModel() {
                Class[] tipos = tiposColumnas;
                @Override
                public Class getColumnClass(int columnIndex) {
                    return tipos[columnIndex];
                }
            };
        
            modelo.addColumn("Reactivo");
            for(int i = 0; i < areas.length; i++) {
                modelo.addColumn(((Areas)areas[i]).getNombreArea());
            }
            
            tablaRefinamiento.setModel(modelo);
        } else {
            DefaultTableModel modelo = new javax.swing.table.DefaultTableModel() {
                Class[] types = new Class[]{
                    java.lang.String.class, java.lang.Boolean.class
                };
                @Override
                public Class getColumnClass(int columnIndex) {
                    return types[columnIndex];
                }
            };
        
            modelo.addColumn("Reactivo");
            modelo.addColumn("Aplica");
            
            tablaRefinamiento.setModel(modelo);
        }
    }
    
    public void guardaLoActual() {
        if(temaSeleccionado != null) {
            Object[][] datosTabla = new Object[tablaRefinamiento.getRowCount()][tablaRefinamiento.getColumnCount()];
            for(int i = 0; i < tablaRefinamiento.getRowCount(); i++) {
                for(int j = 0; j < tablaRefinamiento.getColumnCount(); j++) {
                    datosTabla[i][j] = ((DefaultTableModel) tablaRefinamiento.getModel()).getValueAt(i, j);
                }
            }
            List reactivos = MenuPrincipal.manEstandares.getReactivosPorTema(temaSeleccionado.getIdTema());
            
            if(HAPSIEApp.trabajarConAreas) {
                List areas = MenuPrincipal.manAreas.getFullAreas();
        
                for(int i = 0; i < reactivos.size(); i++) {
                    for(int j = 1; j < areas.size() + 1; j++) {
                        boolean datoActual = (Boolean) datosTabla[i][j];
                        if(!datoActual && MenuPrincipal.manRelaciones.tieneRelacion(((Areas)areas.get(j-1)).getIdArea(), ((CatReactivos) reactivos.get(i)).getIdReactivo())) {
                            MenuPrincipal.manRelaciones.borraRelacionPorAreaYReactivo(((Areas)areas.get(j-1)).getIdArea(), ((CatReactivos) reactivos.get(i)).getIdReactivo());
                        }
                        if(datoActual && !MenuPrincipal.manRelaciones.tieneRelacion(((Areas)areas.get(j-1)).getIdArea(), ((CatReactivos) reactivos.get(i)).getIdReactivo())) {
                            MenuPrincipal.manRelaciones.creaYGuardaRelacion(((Areas)areas.get(j-1)).getIdArea(), ((CatReactivos) reactivos.get(i)).getIdReactivo(), 0);
                        }
                    }
                }
            } else {
                for(int i = 0; i < reactivos.size(); i++) {
                    boolean datoActual = (Boolean) datosTabla[i][1];
                    if(!datoActual && MenuPrincipal.manRelaciones.tieneRelacion(-1, ((CatReactivos) reactivos.get(i)).getIdReactivo())) {
                        MenuPrincipal.manRelaciones.borraRelacionPorAreaYReactivo(-1, ((CatReactivos) reactivos.get(i)).getIdReactivo());
                    }
                    if(datoActual && !MenuPrincipal.manRelaciones.tieneRelacion(-1, ((CatReactivos) reactivos.get(i)).getIdReactivo())) {
                        MenuPrincipal.manRelaciones.creaYGuardaRelacion(-1, ((CatReactivos) reactivos.get(i)).getIdReactivo(), 0);
                    }
                }
            }
        }
    }
    
    public boolean[] traeDatosRelacionesPorArea(CatReactivos reactivoActual) {
        boolean[] relaciones = new boolean[tablaRefinamiento.getColumnCount() - 1];
        List todasLasAreas = MenuPrincipal.manAreas.getFullAreas();
        for(int i = 0; i < todasLasAreas.size(); i++) {
            relaciones[i] = MenuPrincipal.manRelaciones.tieneRelacion(((Areas) todasLasAreas.get(i)).getIdArea(), reactivoActual.getIdReactivo());
        }
        return relaciones;
    }
    
    public boolean traeDatosRelacionesPorGeneral(CatReactivos reactivoActual) {
        return MenuPrincipal.manRelaciones.tieneRelacion(-1, reactivoActual.getIdReactivo());
    }
    
    private void llenaTabla() {
        if(tablaRefinamiento.getRowCount() != 0) {
            guardaLoActual();
        }
        
        if(temaSeleccionado != null) {
            List reactivos = MenuPrincipal.manEstandares.getReactivosPorTema(temaSeleccionado.getIdTema());
            ArrayList<Object> datosTabla = new ArrayList<Object>();
            for(int i = 0; i < reactivos.size(); i++) {
                Object[] filaActual = new Object[tablaRefinamiento.getColumnCount()];
                CatReactivos reactivoActual = (CatReactivos) reactivos.get(i);
                filaActual[0] = (reactivoActual.getTextoReactivo());
                if(HAPSIEApp.trabajarConAreas) {
                    boolean[] relaciones = traeDatosRelacionesPorArea(reactivoActual);
                    for(int j = 1; j < filaActual.length; j++) {
                        filaActual[j] = relaciones[j-1];
                    }
                    datosTabla.add(filaActual);
                } else {
                    filaActual[1] = traeDatosRelacionesPorGeneral(reactivoActual);
                    datosTabla.add(filaActual);
                }
            }
            
            for(int i = 0; i < datosTabla.size(); i++) {
                ((DefaultTableModel) tablaRefinamiento.getModel()).addRow((Object[])datosTabla.get(i));
            }
            
        }
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        arbolDeEstandar = new javax.swing.JTree();
        jScrollPane2 = new javax.swing.JScrollPane();
        tablaRefinamiento = new javax.swing.JTable();
        etiquetaSeleccionaTema = new javax.swing.JLabel();
        botonRegresaMenuGestionAreas = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);

        jScrollPane1.setName("jScrollPane1"); // NOI18N

        arbolDeEstandar.setFont(new java.awt.Font("Arial", 1, 13));
        arbolDeEstandar.setAutoscrolls(true);
        arbolDeEstandar.setName("arbolDeEstandar"); // NOI18N
        jScrollPane1.setViewportView(arbolDeEstandar);

        jScrollPane2.setAutoscrolls(true);
        jScrollPane2.setName("jScrollPane2"); // NOI18N

        tablaRefinamiento.setBackground(new java.awt.Color(254, 254, 254));
        tablaRefinamiento.setFont(new java.awt.Font("Arial", 0, 14));
        tablaRefinamiento.setForeground(new java.awt.Color(1, 1, 1));
        tablaRefinamiento.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "Title 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        tablaRefinamiento.setToolTipText("");
        tablaRefinamiento.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
        tablaRefinamiento.setGridColor(new java.awt.Color(136, 136, 136));
        tablaRefinamiento.setIntercellSpacing(new java.awt.Dimension(1, 3));
        tablaRefinamiento.setName("tablaRefinamiento"); // NOI18N
        tablaRefinamiento.setOpaque(false);
        tablaRefinamiento.setRequestFocusEnabled(false);
        tablaRefinamiento.setShowHorizontalLines(false);
        tablaRefinamiento.setShowVerticalLines(false);
        jScrollPane2.setViewportView(tablaRefinamiento);

        etiquetaSeleccionaTema.setFont(new java.awt.Font("Arial", 1, 13));
        etiquetaSeleccionaTema.setText("Selecciona un tema para configurar:");
        etiquetaSeleccionaTema.setName("etiquetaSeleccionaTema"); // NOI18N

        botonRegresaMenuGestionAreas.setFont(new java.awt.Font("Tahoma", 1, 12)); // NOI18N
        botonRegresaMenuGestionAreas.setText("Regresar al Menú");
        botonRegresaMenuGestionAreas.setName("botonRegresaMenuGestionAreas"); // NOI18N
        botonRegresaMenuGestionAreas.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonRegresaMenuGestionAreasActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 240, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(etiquetaSeleccionaTema))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 664, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(botonRegresaMenuGestionAreas, javax.swing.GroupLayout.PREFERRED_SIZE, 141, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(26, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(40, 40, 40)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(botonRegresaMenuGestionAreas, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jScrollPane2, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 296, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(etiquetaSeleccionaTema)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 426, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(54, 54, 54)))
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

private void botonRegresaMenuGestionAreasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonRegresaMenuGestionAreasActionPerformed

    guardaLoActual();
    setVisible(false);
    getOwner().setVisible(true);
}//GEN-LAST:event_botonRegresaMenuGestionAreasActionPerformed
   
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTree arbolDeEstandar;
    private javax.swing.JButton botonRegresaMenuGestionAreas;
    private javax.swing.JLabel etiquetaSeleccionaTema;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JTable tablaRefinamiento;
    // End of variables declaration//GEN-END:variables
}
